#include <iostream>
#include <fstream>
#include <string>
#define movieNum 10 // 電影數目
using namespace std;
typedef struct rateNode {
float n;
struct rateNode *next;
} RATE;
typedef struct node { // 紀錄電影資料的 struct
int i; // 編號
string name; // 電影名稱
float aveRate; // 平均分數
RATE *rate; // 紀錄評分串列
} MOVIE;
MOVIE movieList[movieNum];
void readDate() {
ifstream my_read_file("movie_data.txt"); // 開啟檔案
string name;
float tmpRate;
int count = 0;
while (my_read_file >> name) { // 讀取各部電影的 loop
{
RATE *tmpNode, *topNode = NULL;
ovieList[count].i = count;
movieList[count].name = name;
while (my_read_file >> tmpRate) { // 讀取評分的 loop
tmpNode = new RATE;
tmpNode->n = tmpRate;
tmpNode->next = NULL;
if (topNode == NULL)movieList[count].rate = tmpNode;
else
topNode->next = tmpNode;
topNode = tmpNode;
}
my_read_file.clear(); // 清除上次讀取的錯誤,否則無法繼續讀取
count++;
}
my_read_file.close();
}
void average() {
float sum;
int count;
RATE *tmpNode;
for (int i = 0; i < movieNum; i++) { // 讀取各電影資料
sum = 0;
count = 0;
tmpNode = movieList[i].rate;
while (tmpNode != NULL) { // 計算平均分
sum += tmpNode->n;
count++;
tmpNode = tmpNode->next;
}
movieList[i].aveRate = sum / count;
}
}
void sort() {
int i, j;
MOVIE temp;
for (i = 0; i < movieNum - 1; i++) {
for (j = i + 1; j < movieNum; j++) {
if (movieList[i].aveRate < movieList[j].aveRate) { // 若較小則交換
temp = movieList[i];
movieList[i] = movieList[j];
movieList[j] = temp;
}
}
}
}
void result() {
int n;
cout << "您想查看排名前幾名的發表?(1~" << movieNum << ") ";
cin >> n;
cout << "==============================" << endl;
cout << "電影排行榜前" << n << "名" << endl;
cout << "==============================" << endl;
for (int i = 0; i < n; i++) {
cout << i + 1 << ": " << movieList[i].name << " " << movieList[i].aveRate << "分" << endl;
}
}
int main() {
readDate();
average();
sort();
result();
return 0;
}
分析程式碼:
程式的邏輯是讀取電影資料並計算,接著排序並輸出結果。使用兩個結構 rateNode
和 node
來儲存電影資訊及其評分,並透過鏈表儲存不定數量的評分。接著,readDate()
從檔案讀取電影名稱和評分,average()
計算每部電影的平均評分,並將結果儲存在結構中。之後,sort()
使用雙重迴圈排序電影,根據平均評分從高到低排列。最後,result()
根據使用者選擇顯示前幾名電影的名稱與平均評分。
最有可能出錯的地方分析:
movie_data.txt
打開失敗,或檔案格式不符合預期,可能會導致資料讀取失敗。尤其是 readDate()
函數中,若檔案內沒有正確的名稱或評分格式,會使得程式無法正確讀取並處理資料。rateNode
的鏈表處理可能會出錯,例如沒有正確地指向 next
結點,會導致資料無法完全遍歷,或出現空指標錯誤。while(my_read_file >> tmpRate)
無法進行正確的迴圈處理。sort()
函數中,如果邊界條件處理不當或交換過程中出現錯誤,可能導致排序結果不正確。!!以上內容是跟著第一次學C++就上手第二版跟著一起實作的!!
今天是製作小專題實作的第一天,程式碼來來回回改了很多次最終還是看了書本上的範例一一地找出問題點。而最有問題的地方是在while跟for迴圈兩個設計的問題,導致程式碼一直跑不出來。希望明天一切順利囉,加油!